/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package tpdisenio2009.mvp.presenter;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Date;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.hibernate.HibernateException;
import tpdisenio2009.model.beans.User;
import tpdisenio2009.mvp.display.CreateUserView;
import tpdisenio2009.services.UserService;
import tpdisenio2009.utils.ValidationUtils;

/**
 *
 * @author DeuterioX
 */
public class CreateUserPresenter extends DefaultPresenter<CreateUserView>{

    private final UserService service;

    private ActionListener save;

    private ActionListener cancel;

    private ItemListener city;

    private ItemListener state;

    private ItemListener country;

    private ItemListener documentType;

    private DocumentListener streetUpdate;

    private DocumentListener streetNumberUpdate;

    private DocumentListener departmentUpdate;

    public CreateUserPresenter( CreateUserView view ) {
        super( view );

        service = new UserService();
        getView().setCountry( service.getCountry() );
        getView().setGenre( service.getGenre() );
        getView().setDocumentType( service.getDocumentType() );

        bind();
    }

    private boolean validate() {

        boolean error = true;
        String errorString = "<html>";
        
        if ( getView().getLastName().isEmpty() ) {
                    errorString += "El campo <strong>Apellido</strong> es obligatorio, y no puede dejarse en blanco.<br>";
                    error = false;
        }
        if ( getView().getFirstName().isEmpty() ) {
                    errorString += "El campo <strong>Nombre</strong> es obligatorio, y no puede dejarse en blanco.<br>";
                    error = false;
        }
        if ( getView().getGenre() == null ) {
                    errorString += "El campo <strong>Sexo</strong> es obligatorio, y no puede dejarse en blanco.<br>";
                    error = false;
        }
        if ( getView().getDocumentType().isEmpty() ) {
                    errorString += "El campo <strong>tipo de documento</strong> es obligatorio, y no puede dejarse en blanco.<br>";
                    error = false;
        }
        if ( getView().getDocument().isEmpty() ) {
                    errorString += "El campo <strong>Documento</strong> es obligatorio, y no puede dejarse en blanco.<br>";
                    error = false;
        } else if( ( getView().getDocumentType().equals("DNI")) && Integer.parseInt(getView().getDocument()) < 10000000){
                    errorString += "Nro de documento fuera de rango.<br>";
                    error = false;
        } else if( ( getView().getDocumentType().equals("LC")) && Integer.parseInt(getView().getDocument()) > 9999999){
                    errorString += "Nro de documento fuera de rango.<br>";
                    error = false;
        } else if( ( getView().getDocumentType().equals("LE")) && Integer.parseInt(getView().getDocument()) > 9999999){
                    errorString += "Nro de documento fuera de rango.<br>";
                    error = false;
        }
        if ( getView().getBirthDate() == null ) {
                    errorString += "El campo <strong>Fecha de nacimiento</strong> es obligatorio, y no se puede dejar en blanco.<br>";
                    error = false;
        } else if ( getView().getBirthDate().before( new Date(-2208978000000L) ) ) {
                    errorString += "El campo <strong>Fecha de nacimiento</strong> no puede ser menor al 01/01/1900.<br>";
                    error = false;
        } else if ( getView().getBirthDate().after( new Date() )) {
                    errorString += "El campo <strong>Fecha de nacimiento</strong> no puede ser mayor a la fecha actual.<br>";
                    error = false;
        }
        if ( !ValidationUtils.validateNumber( getView().getStreetNumber() ) ) {
                    errorString += "El campo <strong>Número</strong> de calle debe ser solamente números.<br>";
                    error = false;
        } else if ( getView().getStreetNumber().length() > 5 ) {
                    errorString += "El campo <strong>Número</strong> de calle no puede ser mayor a 5 dígitos.<br>";
                    error = false;
        }
        if ( !ValidationUtils.validateNumberAndLetters( getView().getDepartment() ) ) {
                    errorString += "El campo <strong>Departamento</strong> debe ser solamente números y/o caracteres.<br>";
                    error = false;
        } else if ( getView().getDepartment().length() > 5 ) {
                    errorString += "El campo <strong>Departamento</strong> no puede ser mayor a 5 dígitos.<br>";
                    error = false;
        }
        if ( !ValidationUtils.validateNumber( getView().getFloor() ) ) {
                    errorString += "El campo <strong>Piso</strong> debe ser solamente números.<br>";
                    error = false;
        } else if ( getView().getFloor().length() > 3 ) {
                    errorString += "El campo <strong>Piso</strong> no puede ser mayor a 3 dígitos.<br>";
                    error = false;
        }
        if ( !ValidationUtils.validateNumber( getView().getBlock() ) ) {
                    errorString += "El campo <strong>Manzana</strong> debe ser solamente números.<br>";
                    error = false;
        } else if ( getView().getBlock().length() > 3 ) {
                    errorString += "El campo <strong>Manzana</strong> no puede ser mayor a 3 dígitos.<br>";
                    error = false;
        }
        if ( getView().getCountry() == null ){
                    errorString += "El campo <strong>País</strong> es obligatorio, y no puede dejarse en blanco.<br>";
                    error = false;
        }
        if ( getView().getState() == null ){
                    errorString += "El campo <strong>Provincia</strong> es obligatorio, y no puede dejarse en blanco.<br>";
                    error = false;
        }
        if ( getView().getCity() == null ){
                    errorString += "El campo <strong>Ciudad</strong> es obligatorio, y no puede dejarse en blanco.<br>";
                    error = false;
        }
        if ( getView().getPassword().isEmpty() ) {
                    errorString += "El campo <strong>Contraseña</strong> es obligatorio, y no puede dejarse en blanco.<br>";
                    error = false;
        }
        if ( getView().getConfirmedPassword().isEmpty() ) {
                    errorString += "El campo <strong>Confirmación</strong> es obligatorio, y no puede dejarse en blanco.<br>";
                    error = false;
        }
        if ( !getView().getPassword().equals( getView().getConfirmedPassword() ) ) {
                    errorString += "La contraseña y la confirmación deben ser iguales.<br>";
                    error = false;
        }
        if ( getView().getEmail().isEmpty() ) {
                    errorString += "El campo <strong>E-mail</strong> es obligatorio, y no puede dejarse en blanco.<br>";
                    error = false;
        } else if ( !ValidationUtils.validateEmail( getView().getEmail() ) ) {
                    errorString += "La dirección de <strong>E-mail</strong> ingresada no es una direción válida.<br>";
                    error = false;
        }
        if ( service.userExist( getView().getDocument(), getView().getDocumentType() ) ) {
                    errorString += "Ya existe un usuario con el <strong>tipo de document</strong> y <strong>número de documento ingresados</strong>.<br>";
                    error = false;
        }
        if (error) {
            return error;
        } else {
            errorString += "</html>";
            getView().showError( getView().FIRST_NAME , errorString, "Error");
            return error;
        }
    }

    public void bind() {

        save = new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                if ( validate() ) {
                    User user = new User();
                    user.setFirstName( getView().getFirstName() );
                    user.setLastName( getView().getLastName() );
                    user.setDocument( getView().getDocument() );
                    user.setDocumentType( getView().getDocumentType() );
                    user.setBirthDate( getView().getBirthDate() );
                    user.setGenre( getView().getGenre() );
                    user.setStreet( getView().getStreet() );
                    if ( !"".equals( getView().getStreetNumber()) )
                        user.setStreetNumber( Integer.parseInt( getView().getStreetNumber() ) );
                    if ( !"".equals( getView().getFloor()) )
                        user.setFloor( Integer.parseInt( getView().getFloor() ) );
                    if ( !"".equals( getView().getDepartment()) )
                        user.setDepartment( getView().getDepartment() );
                    if ( !"".equals( getView().getBlock()) )
                        user.setBlock( Integer.parseInt( getView().getBlock() ) );
                    user.setCountry( getView().getCountry() );
                    user.setState( getView().getState() );
                    user.setCity( getView().getCity() );
                    user.setPassword( getView().getPassword() );
                    user.setEmail( getView().getEmail() );
                    user.setCreationDate( new Date() );
                    try {
                        service.createUser( user );
                        getView().showNotification( "Felicitaciones el usuario ha sido creado exitosamente",
                                "Registración Exitosa" );
                        getView().close();
                    } catch ( HibernateException ex ) {
                        getView().showError( getView().LAST_NAME, ex.getMessage(), "Error inesperado!");
                    }
                }
            }
        };
       

        getView().addSaveListener( save );
        cancel = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if( showConfirmation() ) {
                    getView().close();
                }
            }
        };
        getView().addCancelListener( cancel );
        country = new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                getView().setState( service.getState( getView().getCountry() ) );
                getView().enableState();
            }
        };
        getView().addCountryChangeListener( country );
        state = new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                getView().setCity( service.getCity( getView().getState() ) );
                getView().enableCity();
            }
        };
        getView().addStateChangeListener( state );
        city = new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
            }
        };
        getView().addCityChangeListener( city );
        documentType = new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
            }
        };
        getView().addDocumentTypeChangeListener( documentType );

        streetUpdate = new DocumentListener() {

            public void insertUpdate(DocumentEvent e) {
                getView().enableStreetNumber();
            }

            public void removeUpdate(DocumentEvent e) {
                if ( getView().getStreet().length() == 0 ) {
                    getView().disableStreetNumber();
                }
            }

            public void changedUpdate(DocumentEvent e) {
            }
        };
        getView().addStreetDocumentListener( streetUpdate );

        streetNumberUpdate = new DocumentListener() {

            public void insertUpdate(DocumentEvent e) {
                if (getView().getStreetNumber().length() > 0) {
                    getView().enableBlock();
                    getView().enableDepartment();
                }
            }

            public void removeUpdate(DocumentEvent e) {
                if (getView().getStreetNumber().length() == 0) {
                    getView().disableBlock();
                    getView().disableDepartment();
                    getView().disableFloor();
                }
            }

            public void changedUpdate(DocumentEvent e) {
                throw new UnsupportedOperationException("Not supported yet.");
            }
        };
        getView().addStreetNumberDocumentListener( streetNumberUpdate );

        departmentUpdate = new DocumentListener() {

            public void insertUpdate(DocumentEvent e) {
                if (getView().getDepartment().length() > 0)
                    getView().enableFloor();
            }

            public void removeUpdate(DocumentEvent e) {
                if ( getView().getDepartment() == null ) {
                    getView().disableFloor();
                } else if ( getView().getDepartment().length() == 0 ) {
                    getView().disableFloor();
                }
            }

            public void changedUpdate(DocumentEvent e) {
            }
        };
        getView().addDepartmentDocumentListener( departmentUpdate );
    }

    public void unbind() {

        if ( cancel != null )
            getView().removeCancelListener( cancel );
        if ( city != null )
            getView().removeCityChangeListener( city );
        if ( country != null )
            getView().removeCountryChangeListener( country );
        if ( documentType != null )
            getView().removeDocumentTypeChangeListener( documentType );
        if ( save != null )
            getView().removeSaveListener( save );
        if ( state != null )
            getView().removeStateChangeListener( state );
        if ( streetUpdate != null )
            getView().removeStreetDocumentListener( streetUpdate );
        if ( streetNumberUpdate != null )
            getView().removeStreetNumberDocumentListener( streetNumberUpdate );
        if ( departmentUpdate != null )
            getView().removeDepartmentDocumentListener( departmentUpdate );
    }
    
    private boolean showConfirmation() {
        return getView().showConfirmation( "<html>¿Está seguro que desea salir?<br>Perderá la información no guardada"  );
    }
}